/// 除了孤儿规则 ， Rust 其实还遵循另外一条规则 :重叠( Overlap)规则 。该规 则规定了
/// 不能为重叠的类型实现同 一 个 trait
/// 重叠示意
/// ---
/// impl<T> AnyTrait for T { }
/// impl<T> AnyTrait for T where T: Copy {...}
/// impl<T> AnyTra工t for i32 { }
/// 代码清单中分别为三种类型实现了 AnyTrait。
/// • T是泛型，指代所有的类型。
/// • T where T: Copy 是受 trait 限定约束的泛型 T，指代 实现了 Copy 的 一部分 T， 是所有
/// 类型的子集。
/// • i32 是一个具体的类型。
/// 显而易见，上面三种类型发生了重叠。 T包含了T:Copy，而T Copy包含了i32。
/// 这违反了重叠规 ，所以编译会失败。
/// 这种实现 trait 的方式在 Rust 中叫覆盖式实现(Blanket Impl)
///
/// ```
/// impl<R, T: Add<R> + Clone> AddAssign<R> for T {
///     fn add_assign (&mut self, rhs : R) {
///         let tmp = self.clone() + rhs;
///         *self = tmp;
/// }
/// ```
/// 在代码清单中，为所有类型 T 实现了 AddAssign，该trait定义的 add_assign 方法是+= 赋值操作对应的方法。
/// 这样实现虽然好，但是会带来性能问题，因为会强制所有类型都使用 clone方法， clone方法会有一定的成本开销，
/// 但实际上有的类型并不需要 clone。因为有重叠规则的限制，不能为某些不需要 clone 的具体类型重新实现
/// add_assign 方法。所以，在标准库中 ，为了实现更好的性能 ，
/// 只好为每个具体的类型都各自实现一遍 AddAssign
/// 重叠规则严重影响了代码的复用。试想一下，如果没有重叠规则，则可以默认使用上面对泛型T的实现，
/// 然后对不需要 clone 的类型重新实现 AddAssign，那么就完全没必要为每个具体类型都实现一遍 add_assign方法，
/// 可以省掉很多重复代码。当然，此处只是为了说明重叠规则的问题，
/// 实际上在标准库中会使用宏来简化具体的实现代码 。
/// 那么为了缓解重叠规则带来的问题， Rust 引入了特化 (Specialization)。特化功能 暂时
/// 只能用于 impl 实现，所以也称为 impl 特化 。不过该功能目前还未稳定发布，
/// 只能在Nightly版本的Rust之下使用#![feature(specialization)]特性
pub fn start() {}
